﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;

namespace BibliotecaDigital
{
    public partial class fRegInfo : BibliotecaDigital.fModeloForm
    {
        public Random rdn = new Random();
        public int? idRegistroCarregar;

        public fRegInfo()
        {
            InitializeComponent();
        }

        private void fRegInfo_Load(object sender, EventArgs e)
        {
            montaComboAtividades();
            montaComboCategorias();
            montaComboAssuntos();
            montaComboTitulos();

            if (idRegistroCarregar == null)
            {
                cbAtividade.SelectedIndex = -1;
                cbCategoria.SelectedIndex = -1;
                cbAssunto.SelectedIndex = -1;
            }
            else
            {
                carregaInformacao();
            }
        }

        public bool carregaInformacao()
        {
            try
            {
                bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
                var informacao = conn.Registro.Single(i => i.Id == idRegistroCarregar);
                if (informacao == null) return false;

                cbAtividade.SelectedValue = informacao.IdAtividade;
                cbCategoria.SelectedValue = informacao.IdCategoria;
                cbAssunto.SelectedValue = informacao.IdAssunto;
                cbTitulo.SelectedValue = informacao.IdTitulo;

                tbComentarios.Text = informacao.Comentarios;
                tbOrigem.Text = informacao.Origem;

                //carregando arquivos
                var arquivos = from anx in conn.Anexo
                               join arq in conn.Arquivo on anx.IdArquivo equals arq.Id
                               where anx.IdRegistro == idRegistroCarregar
                               orderby arq.Nome
                               select new
                               {
                                   IdArquivo = arq.Id,
                                   IdAnexo = anx.Id,
                                   anxAtivo = anx.Ativo,
                                   arqAtivo = arq.Ativo,
                                   arqNome = arq.Nome,
                                   arqCaminhoAtual = arq.CaminhoAtual,
                                   arqCaminhoOriginal = arq.CaminhoOriginal,
                                   arqExtensao = arq.Extensao,
                                   arqTamanho = arq.Tamanho,
                                   arqPalavraChave = arq.PalavraChave
                               };

                lvArquivos.Items.Clear();
                ListViewItem novoItem;
                foreach (var arquivo in arquivos)
                {
                    novoItem = new ListViewItem();
                    novoItem.Text = arquivo.arqNome;
                    novoItem.SubItems.Add(arquivo.arqPalavraChave);
                    novoItem.SubItems.Add(arquivo.arqCaminhoAtual);
                    lvArquivos.Items.Add(novoItem);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Erro ao carregar informação: " + e.Message, "Atenção");
                return false;
            }
            return true;
        }

        private IEnumerable<Atividade> listarAtividades()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var atividades = from a in conn.Atividade orderby a.Descricao select a;
            return atividades;
        }

        private IEnumerable<Categoria> listarCategorias()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var categorias = from a in conn.Categoria 
                             where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                             orderby a.Descricao select a;
            return categorias;
        }

        private IEnumerable<Assunto> listarAssuntos()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var assuntos = from a in conn.Assunto
                             where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                             && a.IdCategoria == (cbCategoria.SelectedValue == null ? 0 : (int)cbCategoria.SelectedValue)
                             orderby a.Descricao
                             select a;
            return assuntos;
        }

        private IEnumerable<Titulo> listarTitulos()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var titulos = from a in conn.Titulo
                           where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                           && a.IdCategoria == (cbCategoria.SelectedValue == null ? 0 : (int)cbCategoria.SelectedValue)
                           && a.IdAssunto == (cbAssunto.SelectedValue == null ? 0 : (int)cbAssunto.SelectedValue)
                           orderby a.Descricao
                           select a;
            return titulos;
        }

        private void montaComboAtividades()
        {
            cbAtividade.DataSource = null;
            cbAtividade.DataSource = listarAtividades();
            cbAtividade.ValueMember = "id";
            cbAtividade.DisplayMember = "descricao";
        }

        private void montaComboCategorias()
        {
            cbCategoria.DataSource = null;
            cbCategoria.DataSource = listarCategorias();
            cbCategoria.ValueMember = "id";
            cbCategoria.DisplayMember = "descricao";
        }

        private void montaComboAssuntos()
        {
            cbAssunto.DataSource = null;
            cbAssunto.DataSource = listarAssuntos();
            cbAssunto.ValueMember = "id";
            cbAssunto.DisplayMember = "descricao";
        }

        private void montaComboTitulos()
        {
            cbTitulo.DataSource = null;
            cbTitulo.DataSource = listarTitulos();
            cbTitulo.ValueMember = "id";
            cbTitulo.DisplayMember = "descricao";
        }

        private void fillByToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                this.atividadeTableAdapter.FillBy(this.bibliotecaDataSet.atividade);
            }
            catch (System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Atividade>)cbAtividade.DataSource,
                "id", "descricao", "Atividades"));
            if (selecao != null)
                cbAtividade.SelectedValue = selecao;
        }

        private void btAddAtv_Click(object sender, EventArgs e)
        {
            String novaAtividade = "";
            if (InputBox.show("Nova atividade", "Nome da atividade", ref novaAtividade) == System.Windows.Forms.DialogResult.OK)
            {
                using (bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection()))
                {
                    Atividade novaAtv = new Atividade();
                    novaAtv.Ativo = true;
                    novaAtv.Descricao = novaAtividade;

                    conn.Atividade.InsertOnSubmit(novaAtv);
                    conn.SubmitChanges();
                    montaComboAtividades();
                    cbAtividade.SelectedValue = novaAtv.Id;
                }
            }
        }

        private void btPesqCat_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Categoria>)cbCategoria.DataSource,
                "id", "descricao", "Categorias"));
            if (selecao != null)
                cbCategoria.SelectedValue = selecao;
        }

        private void btAddCat_Click(object sender, EventArgs e)
        {
            if (cbAtividade.SelectedValue == null)
            {
                MessageBox.Show("Selecione uma atividade antes de inserir uma nova categoria.", "Atenção");
                return;
            }

            String novaCategoria = "";
            if (InputBox.show("Nova categoria", "Nome da categoria", ref novaCategoria) == System.Windows.Forms.DialogResult.OK)
            {
                using (bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection()))
                {
                    Categoria novaCat = new Categoria();
                    novaCat.Ativo = true;
                    novaCat.Descricao = novaCategoria;
                    novaCat.IdAtividade = (int)cbAtividade.SelectedValue;

                    conn.Categoria.InsertOnSubmit(novaCat);
                    conn.SubmitChanges();
                    montaComboCategorias();
                    cbCategoria.SelectedValue = novaCat.Id;
                }
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Close();
        }


        private bool validaInformacoes()
        {
            if (cbAtividade.SelectedValue == null || cbCategoria.SelectedValue == null ||
                cbAssunto.SelectedValue == null || cbTitulo.SelectedValue == null)
            {
                MessageBox.Show("Os campos em vermelho são obrigatórios.", "Atenção");
                return false;
            }
            else
                return true;
        }

        private String gerarNomeArquivo()
        {           
            return "f" + rdn.Next(0, Int32.MaxValue);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (!validaInformacoes()) return;

            if (lvArquivos.Items.Count == 0)
            {
                if (MessageBox.Show(
                                 "Nenhum arquivo selecionado. Deseja gravar mesmo assim?",
                                 "Confirmação", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    MessageBox.Show("Operação cancelada.", "Atenção");
                    return;
                }
            }

            using (bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection())) 
            {
                try
                {
                    conn.Connection.Open();
                    conn.Transaction = conn.Connection.BeginTransaction();

                    Registro novoRegistro = idRegistroCarregar == null ? new Registro():
                        (from c in conn.Registro where c.Id == idRegistroCarregar select c).Single();

                    novoRegistro.Ativo = true;
                    novoRegistro.Comentarios = tbComentarios.Text;
                    novoRegistro.DataRegistro = DateTime.Now;
                    novoRegistro.IdAtividade = Convert.ToInt32(cbAtividade.SelectedValue);
                    novoRegistro.IdCategoria = Convert.ToInt32(cbCategoria.SelectedValue);
                    novoRegistro.IdAssunto = Convert.ToInt32(cbAssunto.SelectedValue);
                    novoRegistro.IdTitulo = Convert.ToInt32(cbTitulo.SelectedValue);
                    novoRegistro.Origem = tbOrigem.Text;
                    novoRegistro.Titulo = cbTitulo.SelectedText;

                    var arquivosExcluir = from a in conn.Anexo
                                              join f in conn.Arquivo on a.IdArquivo equals f.Id
                                              where a.IdRegistro == (idRegistroCarregar == null ? 0 : idRegistroCarregar)
                                              select new
                                              {
                                                  caminhoArquivo = f.CaminhoAtual
                                              };

                    ArrayList nomesArquivos = new ArrayList();
                    if (arquivosExcluir.Count() > 0)
                    {
                        foreach (var arq in arquivosExcluir)
                            nomesArquivos.Add(arq.caminhoArquivo);

                        conn.Anexo.DeleteAllOnSubmit(from a in conn.Anexo
                                                     where a.IdRegistro == idRegistroCarregar
                                                     select a);
                        conn.SubmitChanges();
                    }

                    if (idRegistroCarregar == null)
                        conn.Registro.InsertOnSubmit(novoRegistro);

                    Arquivo novoArquivo;
                    List<Arquivo> arquivoInseridos = new List<Arquivo>();
                    Anexo novoAnexo;
                    System.IO.FileInfo info;                    

                    foreach (ListViewItem arquivo in lvArquivos.Items)
                    {
                        novoArquivo = new Arquivo();
                        String novoNomeArquivo = System.IO.Path.GetFileName(arquivo.SubItems[2].Text);

                        if (cbCopiar.Checked || idRegistroCarregar != null)
                        {
                            novoNomeArquivo = gerarNomeArquivo() + System.IO.Path.GetExtension(arquivo.SubItems[2].Text);
                            System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\files\\");
                            System.IO.File.Copy(arquivo.SubItems[2].Text, System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\files\\"+
                                novoNomeArquivo);
                            novoArquivo.CaminhoAtual = System.IO.Path.GetDirectoryName(Application.ExecutablePath) +"\\files\\"+
                                novoNomeArquivo;
                        }
                        else 
                            novoArquivo.CaminhoAtual = arquivo.SubItems[2].Text;
                                                
                        novoArquivo.Ativo = true;
                        novoArquivo.CaminhoOriginal = System.IO.Path.GetDirectoryName(arquivo.SubItems[2].Text);
                        novoArquivo.Extensao = System.IO.Path.GetExtension(arquivo.SubItems[2].Text);
                        novoArquivo.Nome = arquivo.Text;
                        novoArquivo.PalavraChave = arquivo.SubItems[1].Text;

                        info = new System.IO.FileInfo(arquivo.SubItems[2].Text);
                        novoArquivo.Tamanho = Convert.ToInt32(info.Length);
                        arquivoInseridos.Add(novoArquivo);
                    }
                    conn.Arquivo.InsertAllOnSubmit<Arquivo>(arquivoInseridos);

                    conn.SubmitChanges();
                    foreach (Arquivo arquivo in arquivoInseridos)
                    {
                        novoAnexo = new Anexo();
                        novoAnexo.Ativo = true;
                        novoAnexo.IdArquivo = arquivo.Id;
                        novoAnexo.IdRegistro = novoRegistro.Id;
                        conn.Anexo.InsertOnSubmit(novoAnexo);
                    }

                    conn.SubmitChanges();

                    // excluindo arquivos antigos
                    if (idRegistroCarregar != null)
                        for (int i = 0; i < nomesArquivos.Count; i++)
                        {
                            try
                            {
                                System.IO.File.Delete(nomesArquivos[i].ToString());
                            }
                            catch
                            {
                                continue;
                            }
                        }

                    conn.Transaction.Commit();

                    MessageBox.Show("Informação registrada com sucesso.", "Sucesso");
                    button2_Click(sender, e);

                    if (idRegistroCarregar != null)
                        button1_Click_1(sender, e);
                }
                catch (Exception ex)
                {
                    if (conn.Transaction != null)
                        conn.Transaction.Rollback();
                    MessageBox.Show("Erro ao gravar informação: " + ex.Message, "Erro");
                }
                finally
                {
                    if (conn.Connection.State == ConnectionState.Open)
                        conn.Connection.Close();
                }
            }
        }

        private void gbArquivos_Enter(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (fdInserir.ShowDialog() == DialogResult.OK)
            {
                String nomeArquivo = fdInserir.FileName;
                fListaArquivos listArq = new fListaArquivos();
                listArq.tbNomeArq.Text = System.IO.Path.GetFileName(nomeArquivo).Substring(0, 
                    System.IO.Path.GetFileName(nomeArquivo).Length - System.IO.Path.GetExtension(nomeArquivo).Length);
                
                if (listArq.ShowDialog() == DialogResult.OK)
                {
                    ListViewItem novoItem = new ListViewItem();
                    novoItem.Text = listArq.tbNomeArq.Text;
                    novoItem.SubItems.Add(listArq.tbPalavras.Text);
                    novoItem.SubItems.Add(nomeArquivo);
                    lvArquivos.Items.Add(novoItem);
                }
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start(@lvArquivos.SelectedItems[0].SubItems[2].Text);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (lvArquivos.SelectedIndices.Count == 0) return;

            if (MessageBox.Show(
                 "Deseja mesmo excluir o arquivo selecionado?", 
                 "Confirmação", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                lvArquivos.Items.RemoveAt(lvArquivos.SelectedIndices[0]);
            }
        }

        private void lbArquivos_SelectedIndexChanged(object sender, EventArgs e)
        {
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            cbAtividade.SelectedIndex = -1;
            cbCategoria.SelectedIndex = -1;
            cbAssunto.SelectedIndex = -1;
            cbTitulo.SelectedIndex = -1;
            tbComentarios.Text = String.Empty;
            tbOrigem.Text = String.Empty;
            lvArquivos.Items.Clear();
            cbAtividade.Focus();
        }

        private void categoriaBindingSource_CurrentChanged(object sender, EventArgs e)
        {

        }

        private void cbAtividade_SelectedValueChanged(object sender, EventArgs e)
        {
            montaComboCategorias();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Assunto>)cbAssunto.DataSource,
                "id", "descricao", "Assuntos"));
            if (selecao != null)
                cbAssunto.SelectedValue = selecao;
        }

        private void cbCategoria_SelectedIndexChanged(object sender, EventArgs e)
        {
            montaComboAssuntos();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (cbAtividade.SelectedValue == null)
            {
                MessageBox.Show("Selecione uma atividade antes de inserir um novo assunto.", "Atenção");
                return;
            }

            if (cbCategoria.SelectedValue == null)
            {
                MessageBox.Show("Selecione uma categoria antes de inserir um novo assunto.", "Atenção");
                return;
            }

            String novoAssunto = "";
            if (InputBox.show("Novo assunto", "Assunto", ref novoAssunto) == System.Windows.Forms.DialogResult.OK)
            {
                using (bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection()))
                {
                    Assunto novoAss = new Assunto();
                    novoAss.Ativo = true;
                    novoAss.Descricao = novoAssunto;
                    novoAss.IdAtividade = (int)cbAtividade.SelectedValue;
                    novoAss.IdCategoria = (int)cbCategoria.SelectedValue;

                    conn.Assunto.InsertOnSubmit(novoAss);
                    conn.SubmitChanges();
                    montaComboAssuntos();
                    cbAssunto.SelectedValue = novoAss.Id;
                }
            }
        }

        private void cbAtividade_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void cbAssunto_SelectedIndexChanged(object sender, EventArgs e)
        {
            montaComboTitulos();
        }

        private void button10_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Titulo>)cbTitulo.DataSource,
                "id", "descricao", "Títulos"));
            if (selecao != null)
                cbTitulo.SelectedValue = selecao;
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (cbAtividade.SelectedValue == null)
            {
                MessageBox.Show("Selecione uma atividade antes de inserir um novo título.", "Atenção");
                return;
            }

            if (cbCategoria.SelectedValue == null)
            {
                MessageBox.Show("Selecione uma categoria antes de inserir um novo título.", "Atenção");
                return;
            }

            if (cbAssunto.SelectedValue == null)
            {
                MessageBox.Show("Selecione um assunto antes de inserir um novo título.", "Atenção");
                return;
            }

            String novoTitulo = "";
            if (InputBox.show("Novo título", "Título", ref novoTitulo) == System.Windows.Forms.DialogResult.OK)
            {
                using (bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection()))
                {
                    Titulo novoTit = new Titulo();
                    novoTit.Ativo = true;
                    novoTit.Descricao = novoTitulo;
                    novoTit.IdAtividade = (int)cbAtividade.SelectedValue;
                    novoTit.IdCategoria = (int)cbCategoria.SelectedValue;
                    novoTit.IdAssunto = (int)cbAssunto.SelectedValue;

                    conn.Titulo.InsertOnSubmit(novoTit);
                    conn.SubmitChanges();
                    montaComboAssuntos();
                    cbTitulo.SelectedValue = novoTit.Id;
                }
            }
        }

    }
}
